<script>
    //layui相关功能封装,
    /*
    layui相关功能封装
    @authstr
    * */

    /*
    * 参考示例:
	* https://www.layui.com/doc/modules/table.html
	* 封装了layui_table的一些常用功能
    * */
    var layui_table = {
        //表格原始属性的值, 如<table id="table_div" lay-filter="main" ></table> 中的mian
        lay_attr: null,
        //表格渲染结束后的表格对象
        tableins: null,
        //用于创建表格的参数
        table_para: {
            elem: '#table_div'
            //容器唯一 id.id 是对表格的数据操作方法上是必要的传递条件
            , id: "table_id"
            , height: 400
            //数据接口
            // ,url: '${request.contextPath}/user/query'
            //接口http请求类型
            , method: 'get'
            //默认每页数据条数
            , limit: 20
            //开启分页
            , page: true
            //开启表格头部工具栏区域
            // ,toolbar:"#toolbarDemo"
            //默认工具
            , defaultToolbar: ['filter', 'exports', 'print']
            //其他请求参数
            , where: {}
            //定义请求时相关分页参数
            , request: {
                //页码的参数名称,默认：page
                pageName: 'current'
                //每页数据量的参数名,默认：limit
                , limitName: 'size'
            }
            //对分页返回数据进行转换
            , parseData: function (res) {
                return {
                    //解析接口状态
                    "code": res.code,
                    //解析提示文本
                    "msg": res.msg,
                    //解析数据长度
                    "count": res.data.total,
                    //解析数据列表
                    "data": res.data.records
                };
            }
            // ,cols: [[ //表头
            //     {field: 'id', title: 'id', sort: true,type:'checkbox', fixed: 'left'}
            //     ,{field: 'id', title: 'ID'}
            //     ,{field: 'username', title: '用户名'}
            //     ,{field: 'password', title: '密码'}
            //     ,{field: 'sex', title: '性别'}
            //     ,{field: 'email', title: '邮箱'}
            //     ,{field: 'phone', title: '手机号'}
            //     ,{field: 'remark', title: '备注'}
            // ]]
        },
        //设置表格渲染的核心参数 url和表头信息,表格头部工具栏区域(script的id)
        set_table_data: function (url, cols, toolbar) {
            layui_table.table_para.toolbar = toolbar;
            layui_table.table_para.url = url;
            layui_table.table_para.cols = cols
        },
        //设置表格渲染的核心参数 url,限制条件,表头信息,表格头部工具栏区域(script的id)
        set_table_data_where: function (url,where, cols, toolbar) {
            layui_table.table_para.toolbar = toolbar;
            layui_table.table_para.where=where;
            layui_table.table_para.url = url;
            layui_table.table_para.cols = cols
        },
        //更新表格的参数
        update_table_para:function(para){
            if(para!=null){
                for(var key in para){
                    layui_table.table_para[key]=para[key];
                }
            }
        },
        //表格渲染
        table_render: function (para) {
            //预设表格高度
            layui_table.table_para.height= $("body").height()-80;
            //更新参数
            layui_table.update_table_para(para);
            layui_table.tableins = layui.table.render(layui_table.table_para);
        },

        //表格搜索 参数:搜索参数
        search: function (search_para) {
            var curr_page=1;
            // if(search_para==null){
            //     curr_page=$(".layui-laypage-em").next().html();
            // }
            var search_para = {
                where: search_para,
                page: {
                    curr: curr_page
                }
            }
            layui.table.reload(layui_table.table_para.id, search_para)
        },

        //设置点击表格行,进行选中
        click_line_checked: function () {
            layui_table.click_line_checked_operation(false);
        },

        //设置点击表格行,进行选中
        click_line_checked_operation: function (is_alone) {
            //https://fly.layui.com/jie/31942/
            $(document).on("click", ".layui-table-body table.layui-table tbody tr", function () {
                var index = $(this).attr('data-index');
                var tableBox = $(this).parents('.layui-table-box');
                if (tableBox.find(".layui-table-fixed.layui-table-fixed-l").length > 0) {
                    tableDiv = tableBox.find(".layui-table-fixed.layui-table-fixed-l")
                } else {
                    tableDiv = tableBox.find(".layui-table-body.layui-table-main")
                }
                if(is_alone){
                    //限定只能选中一行数据
                    var trs = tableDiv.find(".layui-unselect.layui-form-checkbox.layui-form-checked").parent().parent().parent();
                    for (var i = 0; i < trs.length; i++) {
                        var ind = $(trs[i]).attr("data-index");
                        if (ind != index) {
                            var checkCell = tableDiv.find("tr[data-index=" + ind + "]").find("td div.laytable-cell-checkbox div.layui-form-checkbox I");
                            if (checkCell.length > 0) {
                                checkCell.click()
                            }
                        }
                    }
                }

                var checkCell = tableDiv.find("tr[data-index=" + index + "]").find("td div.laytable-cell-checkbox div.layui-form-checkbox I");
                if (checkCell.length > 0) {
                    checkCell.click()
                }
            });
            $(document).on("click", "td div.laytable-cell-checkbox div.layui-form-checkbox", function (e) {
                e.stopPropagation()
            });
        },

        //获取当前选中行的数据
        get_checked_data: function () {
            //获取选中行对象
            var checkStatus = layui.table.checkStatus(layui_table.table_para.id);
            //获取数据
            return checkStatus.data;
        },

        //要求选中一条数据,且返回id
        selectOne: function () {
            var table_data = layui_table.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length != 1) {
                if (table_data.length == 0) {
                    layer.msg("至少要选中一条数据", {icon: 2});
                } else {
                    layer.msg("只能选择一条数据", {icon: 2});
                }
                return null;
            }
            var one_id = tool.paraGetOneId(table_data);
            if (one_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return one_id;
        },

        //要求选中多条数据,且返回id
        selectMany: function () {
            var table_data = layui_table.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length < 1) {
                layer.msg("至少要选中一条数据", {icon: 2});
                return null;
            }
            var many_id = tool.paraGetId(table_data);
            if (many_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return many_id;
        },
        //在表头,以指定格式进行时间转换
        date_format: function (date, format) {
            if (!tool.isEmpty(date)) {
                return new Date(date).format("yyyy-MM-dd hh:mm:ss")
            }
            return "";
        }
    }

    var layui_table_tree={
        //表格渲染结束后的树状表格对象
        tableins: null,
        //用于创建表格的参数
        table_para: {
            elem: '#table_div'
            //容器唯一 id. id 是对表格的数据操作方法上必要的传递条件
            , id: "tableTree_id"
            //请求参数
            ,para:''
            ,url:"${request.contextPath}/role/getAl"
            ,data:null  // 数据
            ,tree: {
                //是否是pid形式的数据
                isPidData:true
                // 折叠图标显示在第几列
                ,iconIndex: 1
                // 设定id的字段名
                ,idName:"id"
                //设定pid的字段名，children形式数据不需要
                , pidName:'parent_id'
                //自定义默认展开的字段名
                ,openName:'name'
            },
            cols: null
        },

        //设置表格渲染的核心参数 url和表头信息,url参数
        set_table_data: function (url, cols, para) {
            layui_table_tree.table_para.url = url;
            layui_table_tree.table_para.cols = cols;
            layui_table_tree.table_para.para = para;
        },
        //设置表格渲染的核心参数 url和表头信息,url参数,tree显示设置
        set_table_data_tree: function (url, cols, para,tree) {
            layui_table_tree.table_para.url = url;
            layui_table_tree.table_para.cols = cols;
            layui_table_tree.table_para.para = para;
            layui_table_tree.table_para.tree = tree;
        },
        //更新表格的参数
        update_table_para:function(para){
            if(para!=null){
                for(var key in para){
                    layui_table_tree.table_para[key]=para[key];
                }
            }
        },

        //通过设置的url与参数相关信息,加载tree展示需要的数据
        load_tree_data(para){
            layui_table_tree.update_table_para(para);
            var url=layui_table_tree.table_para.url;
            var para=layui_table_tree.table_para.para;

            $.ajaxSettings.async=false;
            $.getJSON(url, para,function (o) {
                if (o.code == 0) {
                    layui_table_tree.table_para.data=o.data;
                }
            });
            $.ajaxSettings.async=true;

        },
        //表格渲染
        table_render: function () {
            layui_table_tree.tableins = layui.treeTable.render(layui_table_tree.table_para);
        },
        //加载表格数据并渲染
        table_load_render:function(para){
            layui_table_tree.load_tree_data(para);
            layui_table_tree.table_render();
        },

        //表格搜索  search_para: 请求的参数
        search: function (search_para) {
            layui_table_tree.table_para.para=search_para;
            layui_table_tree.table_load_render();
        },
        // 展开全部
        expandAll:function(){
            layui_table_tree.tableins.expandAll();
        },
        //  折叠全部
        foldAll:function(){
            layui_table_tree.tableins.foldAll();
        },

        //取消复选框 父元素到子元素的联动
        closeCheckboxParentLinkage:function () {
            var nullFunc=function(){
            };
            layui_table_tree.tableins.__proto__.checkSubCB=nullFunc;
        },
        //取消复选框 全部父子联动
        closeCheckboxAllLinkage:function () {
            var nullFunc=function(){
            };
            layui_table_tree.tableins.__proto__.checkSubCB=nullFunc;
            layui_table_tree.tableins.__proto__.checkParentCB=nullFunc;
        },

        //设置点击表格行,进行选中
        click_line_checked: function () {
            // 监听行单击事件
            layui.treeTable.on('row(table_div)', function(obj){
                var tr=obj.tr;
                var input= tr.children().eq(0).find("input").next('.layui-form-checkbox')
                var input_radio= tr.children().eq(0).find("input").next('.layui-form-radio');
                input.click()
                input_radio.click();
            });
        },

        //获取当前选中行的数据
        get_checked_data: function () {
            return layui_table_tree.tableins.checkStatus()
        },
        //获取当前选中行的数据的id
        get_checked_data_id: function () {
            var table_data = layui_table_tree.get_checked_data();
            return tool.paraGetId(table_data);
        },
        //要求选中一条数据,且返回id
        selectOne: function () {
            var table_data = layui_table_tree.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length != 1) {
                if (table_data.length == 0) {
                    layer.msg("至少要选中一条数据", {icon: 2});
                } else {
                    layer.msg("只能选择一条数据", {icon: 2});
                }
                return null;
            }
            var one_id = tool.paraGetOneId(table_data);
            if (one_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return one_id;
        },

        //要求选中多条数据,且返回id
        selectMany: function () {
            var table_data = layui_table_tree.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length < 1) {
                layer.msg("至少要选中一条数据", {icon: 2});
                return null;
            }
            var many_id = tool.paraGetId(table_data);
            if (many_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return many_id;
        },
        //设置选中
        setChecked:function (ids) {
            layui_table_tree.tableins.setChecked(ids)
        }
    }


    /*
    * 参考示例:
    *  https://www.layui.com/doc/modules/laydate.html
    * 封装了layui 日期控件的一些常用功能
    * */
    var layui_date = {
        //创建日期控件的常用参数
        data_para: {
            //工具按钮,分别是"清除","现在","确认"
            btns: ['clear', 'now', 'confirm']
            //指定元素
            // elem: '#startDate'
            //指定类类型 year	年选择器 month年月选择器	date日期选择器	time时间选择器	datetime日期时间选择器
            , type: 'date'
            //是否显示公历节日
            , calendar: true
        },

        //通过一个字面量数组,创建日期控件
        render: function (para) {
            return layui.laydate.render(para);
        },
        //通过控件元素(id)和日期类型,创建日期控件
        date_render: function (elem, type) {
            //复制日期控件的参数,防止生成多个日期控件,共用一个参数对象
            var copy_para = JSON.parse(JSON.stringify(layui_date.data_para))
            copy_para.elem = elem;
            copy_para.type = type;
            return layui_date.render(copy_para);
        },
        //通过控件键元素(id)和日期类型,开始时间回传元素,结束时间回传元素,创建一个日期范围选择器
        range_date_render: function (elem, type, start_elem, end_elem) {
            var copy_para = JSON.parse(JSON.stringify(layui_date.data_para))
            copy_para.elem = elem;
            copy_para.type = type;
            //设置启用日期范围,间隔符为"~"
            copy_para.range = "至";
            //设置选择日期后的回调函数
            copy_para.done = function (value, date, endDate) {
                if (!tool.isEmpty(value)) {
                    //获取开始时间和结束时间的字符串
                    var two_date = value.split(copy_para.range);
                    //将开始时间和结束时间设置到指定的元素上
                    $(start_elem).val(two_date[0].trim());
                    $(end_elem).val(two_date[1].trim());
                }else{
                    $(start_elem).val("");
                    $(end_elem).val("");
                }

            }
            return layui_date.render(copy_para);
        }
    }

    /*
    * 封装了 layer 的一些常用弹窗
    * */
    var layui_layer = {
        //进行错误提示
        error_alert: function (msg) {
            layer.alert(msg, {
                skin: 'layui-layer-molv' //样式类名
                , closeBtn: 0
                , title: "错误提示"
            });
        },
        //弹出提示框 message提示的消息   func点确定要执行的操作
        confirm: function (message,func) {
             layer.confirm(message, {
                btn: ['确定','取消'] //按钮
            },func, function(){});
        },
        //判断请求返回值,是否有返回值,是否有 code:1 数据,没有进行异常提示
        ajax_verify:function (o) {
            if(o==null){
                layui_layer.error_alert("请求出错!");
                return false;
            }
            if (o.code == 0) {
                layer.msg(o.message);
                return true;
            }else{
                layui_layer.error_alert(o.message);
                return false;
            }
        },
        ajax_verify_not_success_hint:function (o) {
            if(o==null){
                layui_layer.error_alert("请求出错!");
                return false;
            }
            if (o.code == 0) {
                return true;
            }else{
                layui_layer.error_alert(o.message);
                return false;
            }
        },
        //layer 关闭弹窗自身
        layer_close_current: function () {
            var index=parent.layer.getFrameIndex(window.name);
            parent.layer.close(index);
        }


    }



    $(function () {
        $(document).ajaxError(
            //所有ajax请求异常的统一处理函数，处理
            function(event,xhr,options,exc ){
                if(xhr.status == 'undefined'){
                    return;
                }
                if(tool.isEmpty(xhr.responseJSON.message)){
                    layui_layer.error_alert("请求出错,响应码为:"+xhr.status);
                }else{
                    layui_layer.error_alert("服务出错,["+xhr.status+"]:"+xhr.responseJSON.message);
                }
            }
        );
    });

</script>